#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <iostream>
#include <vector>
struct person {
    std::string name;
    int age;
    std::string sex;
} _per;
std::vector<person> vec;
int main() {
  MYSQL mysql_conn;
  MYSQL* mysql = mysql_init(&mysql_conn);
  if (mysql == NULL) {
    printf("mysql init err\n");
    return -1;
  }
  //等价&mysql_conn,"127.0.0.1"...
  if (mysql_real_connect(mysql, "127.0.0.1", "root", "123", "stu", 3306, NULL,
                         0) == NULL) {
    printf("connect err\n");
    return -1;
  }
  printf("连接成功\n");

  // 设置编码为utf8
  mysql_set_character_set(mysql, "utf8");

  //执行插入语句：
  //李四后面的;可加可不加
  const char* sql1 = "insert into informationTab values('wcm', 50, 'boy')";
  // if (mysql_query(mysql, sql1) != 0) {
  //   printf("插入语句失败\n");
  //   mysql_close(mysql);
  //   return -1;
  // }
  //执行更新语句：
  sql1 = "update informationTab set age=55 where name='wcm'";

  if (mysql_query(mysql, sql1) != 0) {
    printf("更新语句失败\n");
    mysql_close(mysql);
    return -1;
  }
  //执行查询语句：

  // 查询scott数据库下的dept部门表
  const char* sql = "select * from informationTab";
  // 执行这个sql语句
  int ret = mysql_query(mysql, sql);
  if (ret != 0) {
    printf("mysql_query() a失败了, 原因: %s\n", mysql_error(mysql));
    return -1;
  }

  // 4. 取出结果集
  MYSQL_RES* res = mysql_store_result(mysql);
  if (res == NULL) {
    printf("mysql_store_result() 失败了, 原因: %s\n", mysql_error(mysql));
    return -1;
  }

  // 5. 得到结果集中的列数
  int num = mysql_num_fields(res);
  std::cout << "数据表中的列数 = " << num << std::endl;

  // 6. 得到所有列的名字, 并且输出
  MYSQL_FIELD* fields = mysql_fetch_fields(res);
  for (int i = 0; i < num; ++i) {
    printf("%s\t\t", fields[i].name);
  }
  printf("\n");

  // 7. 遍历结果集中所有的行
  
  MYSQL_ROW row;
  while ((row = mysql_fetch_row(res)) != NULL) {
    // 将当前行中的每一列信息读出
    for (int i = 0; i < num; ++i) {
      printf("%s\t\t", row[i]);
    }
    vec.push_back(person{row[0], std::stoi(std::string(row[1])), row[2]});
    printf("\n");
  }

for (auto it : vec) {
  std::cout << it.name  << "  "<< it.age<< "  " << it.sex << "  " << std::endl;
}
  // 8. 释放资源 - 结果集
  mysql_free_result(res);

  mysql_close(mysql);
  return 0;
}